<?php
// 声明编码
header("Content-Type:text/html;charset=utf-8");

//临时改变单个脚本的环境参数
//用函数来设置脚本的运行时间 0 不限制时间 临时改动
set_time_limit(0); //设置脚本运行时间为0

// 给一个默认 user_agent 让他认为自己是浏览器
ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)');

//读取网站链接里面的内容 返回一个读取的字符串
// $content = file_get_contents("https://www.readnovel.com/book/28576647607910304#Catalog"); //少
$content = file_get_contents("https://www.readnovel.com/book/18511797008623504#Catalog");

// 开始标记：<div class="volume-wrap">
                // <div>
                //     <ul></ul>
                // </div>
// 结束标记：</div>

//如果正则表达式中 没有出现过() 那么返回res结果 array(3) 只会有一个元素结果
// 如果出现了() 出现几次就会 + 几个元素 到 array 结果中
// 当前:array(2) 0下标：是完整的结果   1下标：第一个出现括号的结果
// $reg = "/<div\s*class=\"volume-wrap\">(.*)<\/div>/imsU";

//首次匹配 是从 整个 <html></html> 取出某个片段部分
$reg = "/<div\s*class=\"volume-wrap\">.*<\/div>/imsU";
preg_match($reg, $content, $res);

//判断唯一的结果是否有拿到
$res = isset($res[0]) ? trim($res[0]) : "";

if(empty($res))
{
    echo "匹配的列表内容为空\r\n";
    exit;
}

echo "开始采集\r\n";

//二次匹配 拿a标签
// <a href="/chapter/28576647607910304/76730792293748384" target="_blank">第5章栽赃陷害</a>
// array(2)
// {
//     [0] => 完整结果
//     [1] => 链接结果 array(30)
//     [2] => 标题结果 array(30)
// }

// 正则表达式默认情况会自动贪婪的
$reg = "/<a\s*href=\"(.*)\"\s*target=\"_blank\">(.*)<\/a>/imsU";
preg_match_all($reg, $res, $html);

$links = isset($html[1]) ? $html[1] : [];
$titles = isset($html[2]) ? $html[2] : [];

if(empty($links) || empty($titles))
{
    echo "链接或标题未获取\r\n";
    exit;
}

echo "已采集到列表和标题\r\n";

$result = "";

foreach($links as $key=>$item)
{
    $title = "《".$titles[$key]."》";

    //组装完整url地址
    $url = "https://www.readnovel.com".$item;

    //再次去读取链接里面的内容
    $content = file_get_contents($url);

    if(empty($content))
    {
        echo "$title 未获取到\r\n";
        continue;  //退出一次
    }

    // 开始标记：<div class="ywskythunderfont">
    // 结束标记：</div>
    $reg = "/<div\s*class=\"ywskythunderfont\">.*<\/div>/imsU";
    preg_match($reg, $content, $description);

    $description = isset($description[0]) ? trim($description[0]) : "";

    if(empty($description))
    {
        echo "$title 为获取到章节内容\r\n";
        continue;
    }

    //替换内容
    $reg = "/<p>|<\/p>/ims";
    $description = preg_replace($reg, "\r\n", $description);
    // <script id="enContentLoader">
    $reg = "/<script\s*id=\"enContentLoader\">.*<\/script>/ims";
    $description = preg_replace($reg, "", $description);

    //剩下的标签不要了 去除字符串里面的 html标签
    $description = strip_tags($description);

    echo "已采集：$title \r\n";

    //拼接每次的结果
    $result .= "$title \r\n $description \r\n";

    //防止被识别
    sleep(0.5);
}

$filename = date("YmdHi", time()).".txt";

file_put_contents("./$filename", $result);  //返回写入的长度
echo "采集完毕\r\n";

// 追加：file_put_contents("./book.txt", $result, FILE_APPEND);

//一次写 内容量：多的
//foreach 循环写法 内容量：少
// file_put_contents（fopen打开文件 fwrite写入 fclose关闭）